// 1. 抽象类：定义饮料制作模板
/// <summary>
/// 饮料抽象类（模板方法模式中的AbstractClass）
/// 定义了饮料制作的算法骨架，将一些步骤延迟到子类中实现
/// </summary>
public abstract class Beverage
{
  /// <summary>
  /// 模板方法 - 定义了饮料制作的算法骨架
  /// 此方法定义了固定的执行流程，子类通过实现抽象方法来定制特定步骤
  /// </summary>
  public void PrepareRecipe()
  {
    BoilWater();      // 公共步骤
    Brew();           // 抽象步骤：子类实现
    PourInCup();      // 公共步骤
    AddCondiments();  // 抽象步骤：子类实现
  }

  // 公共方法（所有饮料都一样）
  /// <summary>
  /// 公共方法 - 烧开水
  /// 所有饮料制作的共同步骤，由父类实现
  /// </summary>
  private void BoilWater() => Console.WriteLine("烧开水");

  /// <summary>
  /// 公共方法 - 将饮料倒入杯中
  /// 所有饮料制作的共同步骤，由父类实现
  /// </summary>
  private void PourInCup() => Console.WriteLine("倒入杯中");

  // 抽象方法：必须由子类实现
  /// <summary>
  /// 抽象方法 - 冲泡饮料
  /// 不同饮料有不同的冲泡方式，由子类实现
  /// </summary>
  protected abstract void Brew();

  /// <summary>
  /// 抽象方法 - 添加调料
  /// 不同饮料添加不同的调料，由子类实现
  /// </summary>
  protected abstract void AddCondiments();
}